// 当 cur == 0 时，此位 1 的出现次数只由高位 high 决定
// 2304 出现 1 的数字范围 0010 ~ 2219
// 当 cur == 1 时，此时 1 的出现次数由高位 high 和低位 low 共同决定
// 2314 出现 1 的数字范围 0010 ~ 2314
// 当 cur > 1 时，此时 1 的出现次数只有高位决定
// 2324 出现 1 的数字范围是 0010 ~ 2319

var countDigitOne = function (n) {
  let digit = 1;
  let res = 0;
  let high = parseInt(n / 10);
  let cur = n % 10;
  let low = 0;
  while (high != 0 || cur != 0) {
    if (cur == 0) {
      res += high * digit;
    } else if (cur == 1) {
      res += high * digit + low + 1;
    } else {
      res += (high + 1) * digit;
    }
    low += cur * digit;
    cur = high % 10;
    high = parseInt(high / 10);
    digit *= 10;
  }
  return res;
};
